#include <fstream>
#include <iostream>
#include "interfaz.h"
#include "pieza.h"


using namespace std;

Interfaz::Interfaz(char* fich){
//Creo un temporal sin comentarios
	ifstream f;
	ofstream o;
	f.open(fich);
	o.open("temp.txt"); //temporal sin comentarios
	
	char linea[1000];
	int dat_gen=0;
	while(f.getline(linea,1000)){		
		
		int posicion=f.tellg();
		//Solo se copian los que no empiezan por '#'
		if(linea[0]!='#') {				
				//recorre la linea por si hay comentarios
				for(int i=0;i<1000;i++){
					if(linea[i]=='#'){
						linea[i-1]='\0';
						f.seekg(posicion);
						}
					if(linea[i]==' ' && dat_gen<4){ //Para quitarle los '#' a los datos generales
					
						linea[i]='\n';
						for(int j=i;linea[j+1]==' ';j++)
							linea[j]=linea[j+1];
						}	
				}
				o<<linea;	//copio linea a fichero temporal			
				o.put('\n');
				dat_gen++;								
		}
					
	}
	
	o.close();
	f.close();
	
	//Abro ahora el temporal como lectura y leo los datos
	f.open("temp.txt");
	
	//Salto espacios del principio
	int pos;
	bool salir=false;
	while(!salir){
		pos=f.tellg();
		f.getline(linea,1000);
		if(linea[0]!='\0'){ 
			salir=true;
			f.seekg(pos);
		}
	}
		
	//Leo datos generales
	num_datos_generales=0;
	salir=false;
	while(!salir){
		f.getline(linea,1000);
		if(linea[0]!='\0'){
			datos_generales[num_datos_generales]=atoi(linea);
			num_datos_generales++;	
		}
		else salir=true;
	}
	
	//Salto espacios
	salir=false;
	while(!salir){
		pos=f.tellg();
		f.getline(linea,1000);
		if(linea[0]!='\0'){ 
			salir=true;
			f.seekg(pos);
		}
	}
	
	//Leo num imagenes
	f.getline(linea,1000);
	numero_imagenes=atoi(linea);
	
	//Leo directorio de imagenes 
	f.getline(linea,1000);
	dir_imagenes=new char[1000];
	for(int i=0;i<1000;i++)
		dir_imagenes[i]=linea[i];
	
	//Leo Imagenes
	imagenes=new char*[numero_imagenes];
	for(int i=0;i<numero_imagenes;i++){
		f.getline(linea,1000);
		imagenes[i]=new char[1000];
		for(int j=0;j<1000;j++)
			imagenes[i][j]=linea[j];
	

	}
	
	//Salto espacios
	salir=false;
	while(!salir){
		pos=f.tellg();
		f.getline(linea,1000);
		if(linea[0]!='\0'){ 
			salir=true;
			f.seekg(pos);
		}
	}
	//Leo datos tablero
	salir=false;
	pos=0;

	while(!salir){
		int pos2=0;
		string aux,aux2;
		f.getline(linea,1000);
		if(linea[0]!='\0'){
			aux.append(linea);
			for(int i=0;aux[i]!='\0';i++){
				if(aux[i]==' '){		
					aux2=aux.substr(pos2,i);
					datos_tablero[pos]=atoi(aux2.c_str());
					pos2=i+1;
					pos++;
				}
			}
			aux2=aux.substr(pos2,aux.size());
			datos_tablero[pos]=atoi(aux2.c_str());
			pos++;	
		}
		else salir=true;
	}

	
	
	//Salto espacios
	salir=false;
	while(!salir){
		pos=f.tellg();
		f.getline(linea,1000);
		if(linea[0]!='\0'){ 
			salir=true;
			f.seekg(pos);
		}
	}
	
	//Leo datos cola
	salir=false;
	pos=0;

	while(!salir){
		int pos2=0;
		string aux,aux2;
		f.getline(linea,1000);
		if(linea[0]!='\0'){
			aux.append(linea);
			for(int i=0;aux[i]!='\0';i++){
				if(aux[i]==' '){		
					aux2=aux.substr(pos2,i);
					datos_cola[pos]=atoi(aux2.c_str());
					pos2=i+1;
					pos++;
				}
			}
			aux2=aux.substr(pos2,aux.size());
			datos_cola[pos]=atoi(aux2.c_str());
			pos++;	
		}
		else salir=true;
	}
	
	//Salto espacios
	salir=false;
	while(!salir){
		pos=f.tellg();
		f.getline(linea,1000);
		if(linea[0]!='\0'){ 
			salir=true;
			f.seekg(pos);
		}
	}
	
	//Leo titulo	
	f.getline(linea,1000);
	titulo=new char[1000];
	for(int i=0;i<1000;i++)
		titulo[i]=linea[i];
	
	//Salto espacios
	salir=false;
	while(!salir){
		pos=f.tellg();
		f.getline(linea,1000);
		if(linea[0]!='\0'){ 
			salir=true;
			f.seekg(pos);
		}
	}
	//Leo fuente titulo
	f.getline(linea,1000);
	fuente_titulo=new char[1000];
	for(int i=0;i<1000;i++)
		fuente_titulo[i]=linea[i];

	
	//Leo datos titulo
	salir=false;
	pos=0;

	while(!salir){
		int pos2=0;
		string aux,aux2;
		f.getline(linea,1000);
		if(linea[0]!='\0'){
			aux.append(linea);
			for(int i=0;aux[i]!='\0';i++){
				if(aux[i]==' '){		
					aux2=aux.substr(pos2,i);
					datos_titulo[pos]=atoi(aux2.c_str());
					pos2=i+1;
					pos++;
				}
			}
			aux2=aux.substr(pos2,aux.size());
			datos_titulo[pos]=atoi(aux2.c_str());
			pos++;	
		}
		else salir=true;
	}
	
	
	//Salto espacios
	salir=false;
	while(!salir){
		pos=f.tellg();
		f.getline(linea,1000);
		if(linea[0]!='\0'){ 
			salir=true;
			f.seekg(pos);
		}
	}
	
	//Leo fuente nivel
	f.getline(linea,1000);
	fuente_nivel=new char[1000];
	for(int i=0;i<1000;i++)
		fuente_nivel[i]=linea[i];
	
	
	//Leo datos nivel
	salir=false;
	pos=0;

	while(!salir){
		int pos2=0;
		string aux,aux2;
		f.getline(linea,1000);
		if(linea[0]!='\0'){
			aux.append(linea);
			for(int i=0;aux[i]!='\0';i++){
				if(aux[i]==' '){		
					aux2=aux.substr(pos2,i);
					datos_nivel[pos]=atoi(aux2.c_str());
					pos2=i+1;
					pos++;
				}
			}
			aux2=aux.substr(pos2,aux.size());
			datos_nivel[pos]=atoi(aux2.c_str());
			pos++;	
		}
		else salir=true;
	}
	
	
	
	//Salto espacios
	salir=false;
	while(!salir){
		pos=f.tellg();
		f.getline(linea,1000);
		if(linea[0]!='\0'){ 
			salir=true;
			f.seekg(pos);
		}
	}
	
	//Leo fuente lineas
	f.getline(linea,1000);
	fuente_lineas=new char[1000];
	for(int i=0;i<1000;i++)
		fuente_lineas[i]=linea[i];
	
	//Leo datos lineas
	salir=false;
	pos=0;

	while(!salir){
		int pos2=0;
		string aux,aux2;
		f.getline(linea,1000);
		if(linea[0]!='\0'){
			aux.append(linea);
			for(int i=0;aux[i]!='\0';i++){
				if(aux[i]==' '){		
					aux2=aux.substr(pos2,i);
					datos_lineas[pos]=atoi(aux2.c_str());
					pos2=i+1;
					pos++;
				}
			}
			aux2=aux.substr(pos2,aux.size());
			datos_lineas[pos]=atoi(aux2.c_str());
			pos++;	
		}
		else salir=true;
	}
	


//Salto espacios
	salir=false;
	while(!salir){
		pos=f.tellg();
		f.getline(linea,1000);
		if(linea[0]!='\0'){ 
			salir=true;
			f.seekg(pos);
		}
	}
	
	//Leo fuente piezas
	f.getline(linea,1000);
	fuente_piezas=new char[1000];
	for(int i=0;i<1000;i++)
		fuente_piezas[i]=linea[i];
	
	
	//Leo datos piezas
	salir=false;
	pos=0;

	while(!salir){
		int pos2=0;
		string aux,aux2;
		f.getline(linea,1000);
		if(linea[0]!='\0'){
			aux.append(linea);
			for(int i=0;aux[i]!='\0';i++){
				if(aux[i]==' '){		
					aux2=aux.substr(pos2,i);
					datos_piezas[pos]=atoi(aux2.c_str());
					pos2=i+1;
					pos++;
				}
			}
			aux2=aux.substr(pos2,aux.size());
			datos_piezas[pos]=atoi(aux2.c_str());
			pos++;	
		}
		else salir=true;
	}
	
	

	
	
	
	//Salto espacios
	salir=false;
	while(!salir){
		pos=f.tellg();
		f.getline(linea,1000);
		if(linea[0]!='\0'){ 
			salir=true;
			f.seekg(pos);
		}
	}
	
	//Leo fuente estado
	f.getline(linea,1000);
	fuente_estado=new char[1000];
	for(int i=0;i<1000;i++)
		fuente_estado[i]=linea[i];
	
	//Leo datos estado
	salir=false;
	pos=0;

	while(!salir){
		int pos2=0;
		string aux,aux2;
		f.getline(linea,1000);
		if(linea[0]!='\0'){
			aux.append(linea);
			for(int i=0;aux[i]!='\0';i++){
				if(aux[i]==' '){		
					aux2=aux.substr(pos2,i);
					datos_estado[pos]=atoi(aux2.c_str());
					pos2=i+1;
					pos++;
				}
			}
			aux2=aux.substr(pos2,aux.size());
			datos_estado[pos]=atoi(aux2.c_str());
			pos++;	
		}
		else salir=true;
	}
	
	//Salto espacios
	salir=false;
	while(!salir){
		pos=f.tellg();
		f.getline(linea,1000);
		if(linea[0]!='\0'){ 
			salir=true;
			f.seekg(pos);
		}
	}
	
	//Leo numero de piezas y creo vector de piezas
	f.getline(linea,1000);
	num_piezas=atoi(linea);
	
	
	//Leo piezas
	vp.SetTama(num_piezas);
	for(int i=0;i<num_piezas;i++){
	int fil=0,col=0;		
		//Salto espacios
		salir=false;
		while(!salir){
			pos=f.tellg();
			f.getline(linea,1000);
			if(linea[0]!='\0'){ 
				salir=true;
				f.seekg(pos);
			}
		}
		
		//Leo filas y columnas de pieza
		int pos2=0;
		
		string aux,aux2;
		f.getline(linea,1000);
		
		aux.append(linea);
		for(int j=0;aux[j]!='\0';j++){
			if(aux[j]==' '){		
				aux2=aux.substr(pos2,j);
				fil=atoi(aux2.c_str());
				pos2=j+1;
				
			}
		}
		aux2=aux.substr(pos2,aux.size());
		col=atoi(aux2.c_str());
		
		
		//Leo valores de pieza
		
		Pieza p(fil,col);
		int fi=0,co=0;
		
		
				
		for(int k=0;k<p.Filas();k++){
			f.getline(linea,1000);
			
			aux.erase();
			aux.append(linea);
			
			
			
			for(int j=0;aux[j]!='\0';j++){
				if(aux[j]==' '){		
					
					aux2=aux.substr(j-1,1);
					p.Set(fi,co,atoi(aux2.c_str()));
					co++;
				}
			}
			
			aux2=aux.substr(aux.size()-1,1);
			
			
			p.Set(fi,co,atoi(aux2.c_str()));
			fi++;
			co=0;			
		
		}
		vp[i]=p;	
		
	}	
		
	
	//Salto espacios
	salir=false;
	while(!salir){
		pos=f.tellg();
		f.getline(linea,1000);
		if(linea[0]!='\0'){ 
			salir=true;
			f.seekg(pos);
		}
	}	
	
	//Leo filas y columnas de tablero	
	int pos2=0;
		
	string aux,aux2;
	f.getline(linea,1000);
		
	aux.append(linea);
	for(int j=0;aux[j]!='\0';j++){
		if(aux[j]==' '){		
			aux2=aux.substr(pos2,j);
			fil_tablero=atoi(aux2.c_str());
			pos2=j+1;
				
		}
	}
	aux2=aux.substr(pos2,aux.size());
	col_tablero=atoi(aux2.c_str());	
	Color color_borde_tablero,color_fondo_tablero;
	color_borde_tablero.SetColor(datos_tablero[5],datos_tablero[6],datos_tablero[7]);
	color_fondo_tablero.SetColor(datos_tablero[8],datos_tablero[9],datos_tablero[10]);
	
	Acumulador acu_aux(datos_tablero[0],datos_tablero[1],datos_tablero[2], datos_tablero[3],datos_tablero[4],fil_tablero,col_tablero,color_borde_tablero,color_fondo_tablero);	
	
	//Leo acumulador
	int fi=0,co=0;
	for(int k=0;k<fil_tablero;k++){
		f.getline(linea,1000);
			
		aux.erase();
		aux.append(linea);
		co=0;
		for(int j=0;aux[j]!='\0';j++){
			if(aux[j]==' '){		
				aux2=aux.substr(j-1,1);
				acu_aux.Set(fi,co,atoi(aux2.c_str()));
				co++;
			}
		}
			
		aux2=aux.substr(aux.size()-1,1);
		acu_aux.Set(fi,co,atoi(aux2.c_str()));
		fi++;			
		
	}
	acu=acu_aux;	
			
	
	
	//Cierro y borro temporal
	f.close();
	system("rm temp.txt");
//**********************************************************************************************************

}
int Interfaz::Semilla()const{return datos_generales[0];}
int Interfaz::TiempoEspera()const{return datos_generales[1];}
int Interfaz::LineasNivel()const{return datos_generales[2];}
int Interfaz::PiezasCola()const{return datos_generales[3];}
int Interfaz::NumImagenes()const{return numero_imagenes;}          
char* Interfaz::DirImagenes()const{return dir_imagenes;}    
char** Interfaz::Imagenes()const{return imagenes;}
int Interfaz::PosXTablero()const{return datos_tablero[0];}
int Interfaz::PosYTablero()const{return datos_tablero[1];}
int Interfaz::AnchoTablero()const{return datos_tablero[2];}
int Interfaz::AltoTablero()const{return datos_tablero[3];}
int Interfaz::MarcoTablero()const{return datos_tablero[4];}
Color Interfaz::ColorBordeTablero()const{
	Color aux;
	aux.SetColor(datos_tablero[5],datos_tablero[6],datos_tablero[7]);
	return aux;


}
Color Interfaz::ColorFondoTablero()const{
	Color aux;
	aux.SetColor(datos_tablero[8],datos_tablero[9],datos_tablero[10]);
	return aux;
}
int Interfaz::PosXCola()const{return datos_cola[0];}
int Interfaz::PosYCola()const{return datos_cola[1];}
int Interfaz::AnchoCola()const{return datos_cola[2];}
int Interfaz::AltoCola()const{return datos_cola[3];}
int Interfaz::MarcoCola()const{return datos_cola[4];}
Color Interfaz::ColorBordeCola()const{
	Color aux;
	aux.SetColor(datos_cola[5],datos_cola[6],datos_cola[7]);
	return aux;


}
Color Interfaz::ColorFondoCola()const{
	Color aux;
	aux.SetColor(datos_cola[8],datos_cola[9],datos_cola[10]);
	return aux;
}
char* Interfaz::Titulo()const{return titulo;}
char* Interfaz::FuenteTitulo()const{return fuente_titulo;}
int Interfaz::TamTitulo()const{return datos_titulo[0];}
int Interfaz::EstiloTitulo()const{return datos_titulo[1];}
Color Interfaz::ColorTitulo()const{
	Color aux;
	aux.SetColor(datos_titulo[2],datos_titulo[3],datos_titulo[4]);
	return aux;
}
int Interfaz::PosXTitulo()const{return datos_titulo[5];}
int Interfaz::PosYTitulo()const{return datos_titulo[6];}
int Interfaz::AnchoTitulo()const{return datos_titulo[7];}
int Interfaz::AltoTitulo()const{return datos_titulo[8];}
int Interfaz::MarcoTitulo()const{return datos_titulo[9];}
Color Interfaz::ColorBordeTitulo()const{
	Color aux;
	aux.SetColor(datos_titulo[10],datos_titulo[11],datos_titulo[12]);
	return aux;
}
Color Interfaz::ColorFondoTitulo()const{
	Color aux;
	aux.SetColor(datos_titulo[13],datos_titulo[14],datos_titulo[15]);
	return aux;
}
char* Interfaz::FuenteNivel()const{return fuente_nivel;}
int Interfaz::TamNivel()const{return datos_nivel[0];}
int Interfaz::EstiloNivel()const{return datos_nivel[1];}
Color Interfaz::ColorNivel()const{
	Color aux;
	aux.SetColor(datos_nivel[2],datos_nivel[3],datos_nivel[4]);
	return aux;
}
int Interfaz::PosXNivel()const{return datos_nivel[5];}
int Interfaz::PosYNivel()const{return datos_nivel[6];}
int Interfaz::AnchoNivel()const{return datos_nivel[7];}
int Interfaz::AltoNivel()const{return datos_nivel[8];}
int Interfaz::MarcoNivel()const{return datos_nivel[9];}
Color Interfaz::ColorBordeNivel()const{
	Color aux;
	aux.SetColor(datos_nivel[10],datos_nivel[11],datos_nivel[12]);
	return aux;
}
Color Interfaz::ColorFondoNivel()const{
	Color aux;
	aux.SetColor(datos_nivel[13],datos_nivel[14],datos_nivel[15]);
	return aux;
}
char* Interfaz::FuenteLineas()const{return fuente_lineas;}
int Interfaz::TamLineas()const{return datos_lineas[0];}
int Interfaz::EstiloLineas()const{return datos_lineas[1];}
Color Interfaz::ColorLineas()const{
	Color aux;
  	aux.SetColor(datos_lineas[2],datos_lineas[3],datos_lineas[4]);
	return aux;
}
int Interfaz::PosXLineas()const{return datos_lineas[5];}
int Interfaz::PosYLineas()const{return datos_lineas[6];}
int Interfaz::AnchoLineas()const{return datos_lineas[7];}
int Interfaz::AltoLineas()const{return datos_lineas[8];}
int Interfaz::MarcoLineas()const{return datos_lineas[9];}
Color Interfaz::ColorBordeLineas()const{
	Color aux;
	aux.SetColor(datos_lineas[10],datos_lineas[11],datos_lineas[12]);
	return aux;
}
Color Interfaz::ColorFondoLineas()const{
	Color aux;
	aux.SetColor(datos_lineas[13],datos_lineas[14],datos_lineas[15]);
	return aux;
}
VectorPiezas& Interfaz::Vector(){return vp;}
char* Interfaz::FuentePiezas()const{return fuente_piezas;}
int Interfaz::TamPiezas()const{return datos_piezas[0];}
int Interfaz::EstiloPiezas()const{return datos_piezas[1];}
Color Interfaz::ColorPiezas()const{
	Color aux;
	aux.SetColor(datos_piezas[2],datos_piezas[3],datos_piezas[4]);
	return aux;
}
int Interfaz::PosXPiezas()const{return datos_piezas[5];}
int Interfaz::PosYPiezas()const{return datos_piezas[6];}
int Interfaz::AnchoPiezas()const{return datos_piezas[7];}
int Interfaz::AltoPiezas()const{return datos_piezas[8];}
int Interfaz::MarcoPiezas()const{return datos_piezas[9];}
Color Interfaz::ColorBordePiezas()const{
	Color aux;
	aux.SetColor(datos_piezas[10],datos_piezas[11],datos_piezas[12]);
	return aux;
}
Color Interfaz::ColorFondoPiezas()const{
	Color aux;
	aux.SetColor(datos_piezas[13],datos_piezas[14],datos_piezas[15]);
	return aux;
}
	
char* Interfaz::FuenteEstado()const{return fuente_estado;}
int Interfaz::TamEstado()const{return datos_estado[0];}
int Interfaz::EstiloEstado()const{return datos_estado[1];}
Color Interfaz::ColorEstado()const{
	Color aux;
	aux.SetColor(datos_estado[2],datos_estado[3],datos_estado[4]);
	return aux;
}
int Interfaz::PosXEstado()const{return datos_estado[5];}
int Interfaz::PosYEstado()const{return datos_estado[6];}
int Interfaz::AnchoEstado()const{return datos_estado[7];}
int Interfaz::AltoEstado()const{return datos_estado[8];}
int Interfaz::MarcoEstado()const{return datos_estado[9];}
Color Interfaz::ColorBordeEstado()const{
	Color aux;
	aux.SetColor(datos_estado[10],datos_estado[11],datos_estado[12]);
	return aux;
}
Color Interfaz::ColorFondoEstado()const{
	Color aux;
	aux.SetColor(datos_estado[13],datos_estado[14],datos_estado[15]);
	return aux;
}	
int Interfaz::NumPiezas()const{return num_piezas;}
int Interfaz::FilasAcumulador()const{return fil_tablero;}
int Interfaz::ColumnasAcumulador()const{return col_tablero;}
Acumulador& Interfaz::Acu(){return acu;}
Interfaz::~Interfaz(){
	delete[] dir_imagenes;
	for(int i=0;i<numero_imagenes;i++) delete[] imagenes[i];
	delete[] imagenes;
	delete[] titulo;
	delete[] fuente_titulo;
	delete[] fuente_nivel;
	delete[] fuente_lineas;
	delete[] fuente_piezas;
	delete[] fuente_estado;	
	
	
}
